import pandas as pd
from rouge import Rouge
import datetime
import pymysql
import requests
import time
import pandas
import re
import xlwt
import to_sql #写入数据库函数

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from urllib import request
from urllib import parse
from bs4 import BeautifulSoup


from warnings import simplefilter
simplefilter(action='ignore', category=FutureWarning)
rouge=Rouge()


import get_hotlist
import get_description
import get_imagesrc
import to_sql


#返回两个List的rouge-f1得分
def rougescore(a,b):
    scores=rouge.get_scores(' '.join(a),' '.join(b))
    return scores[0]['rouge-1']['f']

#该代码块根据data提取出各个热榜，存储在datalist[]中
def seperate_data(data):
    datalist=[]
    data_tmp=pd.DataFrame([],columns=["content","url","source","image_icon"])#临时存储当前热榜
    for i in range(0,len(data)):
        data_tmp=data_tmp.append(data.loc[i])
        if(i==len(data)-1):
            datalist.append(data_tmp.reset_index(drop=True))#重新标号
            data_tmp=data_tmp.drop(index=data_tmp.index)#清空临时表，保留表头
                
        elif(data.loc[i,'source']!=data.loc[i+1,'source']):#该条热榜结束
            datalist.append(data_tmp.reset_index(drop=True))#重新标号
            data_tmp=data_tmp.drop(index=data_tmp.index)#清空临时表，保留表头
    #下面将' " 转义
    for i in range(0,len(datalist)):
        for j in range(0,len(datalist[i])):
            datalist[i].loc[j,'source']= datalist[i].loc[j,'source'].replace("'","")
            datalist[i].loc[j,'source']= datalist[i].loc[j,'source'].replace("\"","")
            datalist[i].loc[j,'image_icon']= datalist[i].loc[j,'image_icon'].replace("'","")
            datalist[i].loc[j,'image_icon']= datalist[i].loc[j,'image_icon'].replace("\"","")
            datalist[i].loc[j,'content']= datalist[i].loc[j,'content'].replace("'","")
            datalist[i].loc[j,'content']= datalist[i].loc[j,'content'].replace("\"","")
    return datalist

# 爬取首页hotlist以及剩下的所有页面的data，存储在data中，共8个dataframe data[0]...
def main():
    data=[]

    time_start = time.time() #开始计时

    for i in range(0,8):#(0,8) this is for test
        data.append(get_hotlist.get_hotlist(i))
        print('crawling successfully: ',i)

    time_end = time.time()    #结束计时
    time_c= time_end - time_start   #运行所花时间
    print('crawling time: ',time_c,'s')

    #拆分首页数据，用于之后的data_summary处理
    datalist=seperate_data(data[0])

    #拆分其它页面的数据，直接根据category将其写入,mysql中 全是sublist

    # #test
    # datalist_1_7=seperate_data(get_hotlist.get_hotlist(5))
    # print("seperate successfully!")
    # to_sql.sublist(5,datalist_1_7)
    # #test


    time_start = time.time() #开始计时

    for i in range(0,8):
        #先根据source分拆
        datalist_1_7=seperate_data(data[i])
        #在写入前还需要把data[0]的[0:3]全部删除，这四条是广告
        if(i==0):
            del(datalist_1_7[0:3])
        #再将list中的数据逐个写入mysql中
        to_sql.sublist(i,datalist_1_7)
        print('to_sql successfully:',i)


    time_end = time.time()    #结束计时
    time_c= time_end - time_start   #运行所花时间
    print('to_sql_1_7 time: ',time_c,'s')


    #data处理模块，该部分将主页的datalist进行: 1.去除前4条广告榜 2.将content中SQL冲突语法进行检测和处
    del(datalist[0:3])#删除头部的广告界面0-3
    #将字符转义删除,单引号双引号均删除
    for i in range(0,len(datalist)):
        for j in range(0,len(datalist[i])):
            datalist[i].loc[j,'content']= datalist[i].loc[j,'content'].replace("'","")
            datalist[i].loc[j,'content']= datalist[i].loc[j,'content'].replace("\"","")


    #初始化构造总榜data_summary
    data_baidu=datalist[3]
    data_zhihu=datalist[1]
    data_baidu.insert(loc=3, column='flag', value=None)


    #比较主榜和次榜，对于次榜重复内容-标注该条news的flag为主榜来源source
    for i in range(0,len(data_baidu)):
        for j in range(0,len(data_zhihu)):
            if(rougescore(list(data_baidu.iloc[i]["content"]),list(data_zhihu.iloc[j]["content"]))>0.3):
                print("baidu:",data_baidu.iloc[i]["content"],"---zhihu:",data_zhihu.iloc[j]["content"])
                #在百度热榜中加入标识位
                data_baidu.loc[i,"flag"]="知乎"#标志为1表示在知乎表中已经存在，相同新闻在知乎中

    #总榜dataframe
    data_summary=pd.DataFrame([],columns=["content","url","source","flag","imagesrc","description"])


    #构造最终总榜,推荐内容均匀从两热榜中选取50条的内容
    num=0#记录已经插入的新闻数
    i=0#zhihu & baidu的指针
    j=0
    while(num<50):
        if(i<len(data_zhihu)-1 and num<50):
            data_summary=data_summary.append(data_zhihu.loc[i])
            i=i+1
            num=num+1
        if(j<len(data_baidu)-1 and num<50):
            if(data_baidu.loc[j,'flag']==None):
                data_summary=data_summary.append(data_baidu.loc[j])
                num=num+1
            j=j+1
    #总榜重新排号,用于rank的记录
    data_summary=data_summary.reset_index(drop=True)



    #下面的模块用于爬取主榜单各个新闻的简介以及相关图片
    description_list=[]
    imagesrc_list=[]

    #使用content进行查找
    content_list=data_summary['content'].values.tolist()

    time_start = time.time() #开始计时

    description_list=get_description.process_content_desc(content_list)
    imagesrc_list=get_imagesrc.process_content_image(content_list)


    time_end = time.time()    #结束计时
    time_c= time_end - time_start   #运行所花时间
    print('get desc&imagesrc time: ',time_c,'s')


    #完成对data_summary的description和imagesrc的写入工作
    for i in range(0,len(data_summary)):
        data_summary.loc[i,'imagesrc']=imagesrc_list[i]
        data_summary.loc[i,'description']=description_list[i]


    #之后是最后的数据库写入模块,写入小榜单的函数to_sql.sublist(category,datalist)包含参数:category(综合1、科技2、娱乐3、社区4、财经5、开发6、报刊7) datalist[](写入对应数据库news_child_category的内容)
    #写入大榜单的函数to_sql.mainlist(data_summary)将data_summary写入news_main中

    #最后将处理完的大榜单的内容写入数据库news中的table news_main中
    to_sql.mainlist(data_summary)

